package module.building.model.dataObj
{
	import code.obj.IconObj;
	import code.utils.CountdownTimer;
	
	import flash.display.Sprite;
	
	import main.App;
	
	import module.building.consts.BuildConst;
	import module.shop.model.dataObj.CommodityObj;

	/**
	 * 建筑数据类，包含了一个建筑的各个信息 
	 * @author hc
	 * 
	 */
	public class BuildingObj extends IconObj
	{	
		/**
		 * 是否能DIY
		 */
		public var canDiy:int;
		/**
		 * 物件类型 
		 */
		public var isoType:String;
		/**
		 * 是否可通行（0是不可；1是可） 
		 */
		public var walkable:int;
		/**
		 * 建筑大类（0:生产类，1：商业类，2：扩展设施，3：民居类，4：装饰类，5：城市功能类，6：军事类，7：NPC类，8：可见预留类，9：不可见预留类） 
		 */
		public var type:int;
		/**
		 * 建筑小类（0_0：装备，0_1：士兵，0_2：农田，1_0：店铺，1_1：商会，2_0：酒馆，2_1：宝物，2_2：科技，2_3：道路，2_4：Buff，4_0：绿化，4_1：人文，4_2：服务，5_0：城堡，5_1：广场，6_0：城墙，6_1：箭塔，6_2：城门） 
		 */
		public var subType:String;
		/**
		 * 占地大小 
		 */
		public var size:uint;
		/**
		 * 物件名称 
		 */
		public var objectName:String;
		/**
		 * 描述 
		 */
		public var description:String;
		/**
		 * 建筑等级，默认为1级 
		 */
		public var level:int = 1;
		/**
		 * 建筑功能 
		 */		
		public var effectAry:Array=[];
		
		/**
		 * 建筑当前的订单，确认不为空方可使用 
		 */
		public var currentOrder:OrderObj;
		
		/**
		 * 建筑作为商品而拥有的属性，确认不为空方可使用 
		 */
		public var commodityObj:CommodityObj;
		/**
		 * 建筑所包含的订单信息，确认长度大于0方可使用
		 */
		public var orderArray:Array;
		/**
		 * 建筑所包含的等级信息，确认长度大于0方可使用
		 */
		public var levelInfo:Array;
		
		/**
		 * 建造完成时间信息 
		 */		
		public var completeTime:int;
		
		/**
		 *	  当前正在生产的订单id列表
		 */
		public var currentOrderArr:Array = [];
//		/**
//		 *	生产倒计时 
//		 */		
//		private var _produceCountDownTime:CountdownTimer;
//		public function set produceCompleteTime(value:int):void
//		{
//			_produceCompleteTime = value;
//			if(_produceCountDownTime == null)
//			{
//				var needTime:int = (value - App.stime > 0)? value - App.stime : 0;
//				_produceCountDownTime = new CountdownTimer(needTime);
//			}
//			else
//			{
//				_produceCountDownTime.restTime = (value - App.stime > 0)? value - App.stime : 0;
//			}
//		}
//		
//		public function get produceCountDownTime():CountdownTimer
//		{
//			if(_produceCountDownTime)
//			{
//				return _produceCountDownTime;
//			}
//			else
//			{
//				return null;
//			}
//		}
		
		/**
		 *	 建筑状态
		 * (1：建造中， 2：闲置状态， 3：生产状态， 
		 * 	 4：可收获状态， 5：损毁状态，6：废墟状态)
		 */		
		private var _status:int = 2;
		
		public function BuildingObj()
		{
			super();
		}
		
		public static function parseData(obj:Object):BuildingObj
		{
			var returnObj:BuildingObj = new BuildingObj();
			returnObj.serverId = obj.serverId;
			returnObj.canDiy = obj.canDiy;
			returnObj.isoType = obj.isoType;
			returnObj.walkable = obj.walkable;
			returnObj.type = obj.type;
			returnObj.subType = obj.subType;
			returnObj.size = obj.size;
			returnObj.objectName = obj.objectName;
			returnObj.name = obj.objectName;
			returnObj.description = obj.description;
			if(obj.effect as String!=""){
				returnObj.effectAry = ((obj.effect) as String).split(",");
			}
			if(obj.hasOwnProperty("level")) returnObj.level = obj.level;
			return returnObj;
		}
		
		/**
		 * 建筑状态 
		 * @param value
		 * 
		 */		
		public function set status(value:int):void{
			_status = value;
		}
		
		public function get status():int{
			if(_status==1){
				if(App.stime>=completeTime){
					return BuildConst.STATUS_IDLE;
				}
			}
			return _status;
		}
		
		/**
		 * 获取十进制 剩余时间 
		 * @return 
		 * 
		 */				
		public function getLeftTime():String
		{
			var str:String = "";
			var stime:Number = App.stime;
			if(stime>0){
				var leftTime:Number = completeTime - stime;
				var d:Date = new Date();
				d.seconds = d.minutes = d.hours = 0;
				var n:Number = d.time + leftTime*1000;
				var s:String = String(new Date(n));
				str= s.split(" ")[3];
			}
			return str;
		}
		
		/**
		 * 当前等级建造总共所需的时间 
		 * @return （秒）
		 * 
		 */
		public function getConstructionTime():int{
			var timeNum:int = 0;
			if(levelInfo&&levelInfo.length>0){
				timeNum = levelInfo[level - 1].time*60;
			}
			return timeNum;
		}
		
		/**
		 * 获取建造已完成的百分比 
		 * @return 0-1
		 * 
		 */		
		public function getBuildPorgress():Number{
			var needTime:int = getConstructionTime();
			var leftTime:int = needTime - (completeTime - App.stime);
			var pecent:Number = int((leftTime*100/needTime))/100;
			if(pecent<0)pecent = 0;
			return pecent;
		}
		
		public function clone():BuildingObj
		{
			var returnObj:BuildingObj = new BuildingObj();
			returnObj.serverId = this.serverId;
			returnObj.canDiy = this.canDiy;
			returnObj.isoType = this.isoType;
			returnObj.walkable = this.walkable;
			returnObj.type = this.type;
			returnObj.subType = this.subType;
			returnObj.size = this.size;
			returnObj.objectName = this.objectName;
			returnObj.name = this.objectName;
			returnObj.description = this.description;
			returnObj.level = this.level;
			returnObj.effectAry = this.effectAry;
			returnObj.status = this.status;
			returnObj.completeTime = this.completeTime;
			returnObj.commodityObj = this.commodityObj;
			returnObj.levelInfo = this.levelInfo;
			returnObj.orderArray = this.orderArray;
			return returnObj;
		}
		
		override public function get iconClassName():String{
			return "MATERIAL_"+serverId+"_LEVEL"+level+"_ICON"; 
//			return "MATERIAL_" + serverId + "_LEVEL" + level + "_ICON";
		}
		
		/**
		 * 得到新的等级图标Sprite对象组向量，并设置宽高,并且:
		 * 没有同时设置w和h时保证同等比例缩放
		 * 否则将拉伸匹配宽高
		 * 
		 * 全都为0时保持原有宽高
		 * @param w:宽度
		 * @param h：高度
		 * @param lW,lH：限制宽高最大值在一个边长为limitW*limitH的矩形内
		 * @param callBack: 素材加载完成后会调用回调方法 
		 * @return 新的图标Sprite对象
		 * 
		 */
		public function getLevelIconArray(w:Number=0,h:Number=0,lW:Number=0,lH:Number=0,callBack:Function=null):Vector.<Sprite> {
			var vector:Vector.<Sprite> = new Vector.<Sprite>;
			var len:int = levelInfo.length;
			var levelBak:int = level;
			for(var i:int=0;i<len;i++){
				level = i+1;
				vector.push(getIcon(w,h,lW,lH,callBack));
			}
			level = levelBak;
			return vector;
		}
	}
}